﻿#pragma once

enum TICKMARK
{                        // 峰辨识标志
    NO_TICK = 0,         // 无标志
    START_TICK = 1,      // 起点
    VALLEY_TICK = 2,     // 谷点
    APEX_TICK = 4,       // 顶点
    STOP_TICK = 8,       // 止点
    SOL_TICK = 16,       // 溶剂峰
    TAN_START_TICK = 32, // 切线起点
    TAN_STOP_TICK = 64,  // 切线止点
    PIXEL_TICK = 128,    //(Windows环境下无意义)
    DELAY_TICK = 256,    // 死时间事件开始
    UNDELAY_TICK = 512,  // 死时间事件结束
};

enum CODE // 分析过返回码
{
    ANAL_NOP = 0,     // 空运行
    ANAL_OK = 1,      // 正常运行
    ANAL_STOP = 2,    // 停止运行
    ANAL_TEST = 3,    // 自动测试出两个重要的峰辨识参数：“最小峰宽”和“噪声阈值”
    ANAL_ERROR = 4,   // 运行过程出错
    ANAL_PEAKEND = 5, // 峰组结束
};

typedef struct tagAUTOPOOL // 自动峰参数学习池
{
    int32_t *buf; // 数据缓冲区(为一循环队列)
    int32_t len;  // 缓冲区长
    int32_t cnt;  // 队列结束指针(开始指针总是为0)
    int32_t ovr;  // 结束指针是否已调头过
} AUTOPOOL;

typedef struct tagTypeExInf
{
    int32_t validNo;     // x0 -> 0
    int32_t nextValidNo; // x1 -> 4
    double Time;         // x2 -> 8
    double band;         // x4 -> 16
    double RTime;        // x6 -> 24
} TypeExInf;

typedef struct tagTickInf
{
    int32_t time;      // x0 -> 0
    TICKMARK tickmark; // x1 -> 4
} TickInf;

typedef struct tagBuffer10
{
    int32_t time;   // x0 -> 0
    float height;   // x1 -> 4
    double area;    // x2 -> 8
    int32_t type;   // x4 -> 16
    float reserved; // x4 -> 20
} Buffer10;

typedef struct tagCalcUnit
{
    int32_t timeStart; // x0 -> 0
    int32_t timeEnd;   // x1 -> 4
    float heightStart; // x2 -> 8
    float heightEnd;   // x3 -> 12
    double area;       // x4 -> 16
} CalcUnit;

typedef struct tagIndexBuffer2
{
    int32_t head2;
    int32_t tail2;
    int32_t flag2;
} IndexBuffer2;

typedef struct tagIndexBuffer1
{
    int32_t head;      // x0 -> 0
    int32_t tail;      // x1 -> 4
    int32_t itemCount; // x2 -> 8
    int32_t flag;
    ;                      // x3 -> 12
    IndexBuffer2 *pIndex2; // x4 -> 16
} IndexBuffer1;

typedef struct tagItemValue
{
    int32_t ts;     // x0 -> 0
    float hs;       // x1 -> 4
    float tr;       // x2 -> 8
    float hr;       // x3 -> 12
    double arear;   // x4 -> 16
    int32_t flag;   // x6 -> 24
    int32_t unused; // x7 -> 28
} ItemValue;

typedef struct tagAnalInfo
{
    CODE code;           // x0 -> 0
    char errMsg[0x400u]; // x1 -> 4
    int32_t status;      // x257 -> 1028
} AnalInfo;

typedef void(__cdecl *TDRAWMARKPROC)(int32_t Chanel, int32_t time, TICKMARK tickmark);

// declarations for functions ---------------------------

extern "C"
{

    //	Anal Functions:	----------------------------
    typedef int32_t (*InitAnalPoo_)(int32_t maxChannels, int32_t realChannels,
                                    void (*drawTickMark)(int32_t ch, int32_t time, TICKMARK tickmark));
    //	功能：初始化通道分析池
    //	参数：
    //		int32_t maxChannels: 允许最大的分析通道数
    //		int32_t realChannels: 最大的实时通道数
    //		void (*drawTickMark)(int32_t ch, int32_t, TICKMARK) : 显示峰辨识标志的函数指针
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*ExitAnalPoo_)();
    //	功能：释放通道分析池
    //	参数：(无)
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败
    typedef int32_t (*GetAnalPoolVolum_)(int32_t *maxReal, int32_t *maxRedo);
    //	功能：获取分析池中允许的最大通道数
    //	参数：
    //		int32_t *maxReal: 实时通道数指针
    //		int32_t *maxRedo: 后处理通道数指针
    //	返回值：最大通道数(包括实时通道数与后处理通道数)

    typedef int32_t (*OpenAna_)(int32_t ch, TSMPBAG *smpBag, TDLLIPINF *ipInf, TDLLEPINF *epInf, TDLLIDTINF *idtInf,
                                TDLLRESINF *resInf, TDLLSTDINF *stdInf);
    //	功能：打开指定的分析通道
    //	参数：
    //		int32_t ch: 指定的通道号 (0,1为实时通道；其它值为后处理通道)
    //		SMPBAG *smpBag: 样品数据包结构指针
    //		IPINF *ipInf: 峰辨识参数描述结构指针
    //		EPINF *epInf: 峰处理参数描述结构指针
    //		IDTINF *idtInf: 组份表描述结构指针
    //		RESINF *resInf: 结果表描述结构指针
    //		STDINF *stdInf: 标样表描述结构指针
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*CloseAna_)(int32_t ch);
    //	功能：关闭指定通道的分析 (该函数与InitAnal函数成对)
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*StartAna_)(int32_t ch);
    //	功能：启动指定通道的分析过程
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*StopAna_)(int32_t ch);
    //	功能：停止指定通道的分析过程
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef CODE (*ExecAna_)(int32_t ch);
    //	功能：执行指定通道的分析过程 (该函数需在调用InitAnal后循环调用)
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值: 分析过程状态码
    //		ANAL_OK：运行过程正常
    //		ANAL_STOP：运行过程已告停止
    //		ANAL_TEST：正自动测试出两个重要的峰辨识参数：“最小峰宽”和“噪声阈值”
    //		ANAL_ERROR：运行过程出错 (此时，可调用GetErrMsg函数获取错误信息)

    typedef int32_t (*GetAnalTim_)(int32_t ch);
    //	功能：获取指定通道当前的分析时间(采样点计数值)
    //	参数：
    //		int32_t ch: 指定的通道号

    typedef char *(*GetErrMs_)(int32_t ch);
    //	功能：获取指定通道分析过程出错时的错误信息
    //	参数：
    //		int32_t ch: 指定的通道号 (ch=-1转义为获取analysis.dll版本号, ch=-2转义为获取analysis.dll接口设置)
    ////2014-08-12:
    //&&&&&& 	返回值: 错误信息 			(若当前状态码不为ANAL_ERROR，返回值为一空串""，并非NULL)

    typedef int32_t (*TickAna_)(int32_t ch);
    //	功能：显示指定通道当前分析过程出现的峰辨识标志
    //		  注：1) 在与ExecAnal同一个循环体中的谱图显示函数中调用;
    //			  2) 谱图显示函数(假定命名为ExecDraw)的调用应后于ExecAnal的调用
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*AnalOpene_)(int32_t ch);
    //	功能：判断指定通道是否已打开 (打开失败视为未打开)
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 已打开
    //		FALSE: 未打开，或打开失败

    typedef int32_t (*AnalBus_)(int32_t ch);
    //	功能：判断指定通道是否已启动分析过程(即“忙”)
    //	参数：
    //		int32_t ch: 指定的通道号
    //	返回值:
    //		TRUE: 已启动
    //		FALSE: 未启动，或未打开，或打开失败

    typedef int32_t (*GetAnalOpene_)(int32_t **chArray);
    //	功能：获取所有已打开的通道号
    //	参数：
    //		int32_t **chArray: 通道号数组指针 (调用时不必为其分配内存)
    //	返回值: 所有已打开的通道数目

    typedef int32_t (*GetAnalBus_)(int32_t **chArray);
    //	功能：获取所有启动分析过程的通道号
    //	参数：
    //		int32_t **chArray: 通道号数组指针 (调用时不必为其分配内存)
    //	返回值: 所有已启动分析过程的通道数目

    typedef int32_t (*SetUkPkFacto_)(int32_t ch, TUkPkFactor *lpUkPkFactor);
    //	功能：设置未知峰的校正因子

    typedef int32_t (*SetIdtTimeOf_)(int32_t ch, float fTimeOfs);
    //	功能：设置组分表的迁移时间[min]

    typedef int32_t (*SetYMinUni_)(int32_t ch, double yMinUnit);
    //	功能：设置检测器最小度量单位(uV)到采集器最小信号单位(1uV)的转换系数(默认值=1)

    typedef int32_t (*SetIdtQualitMod_)(int32_t ch, int32_t nQualitMode, float fTimeWindow);
    //	功能：设置组分表的定性模式
    //	参数：
    //		int32_t nQualitMode: 定性模式 (0-时间带, 1-时间窗, 2-顺序法)
    //		float fTimeWindow: 时间窗[%]

    typedef int32_t (*SetXMinUnit_)(int32_t ch, double xMinUnitK);
    //	功能：设置X轴标注单位(默认为min)到最小标注单位(计算面积之用, 默认为sec)的换算系数(XMinUnit=XMinUnitK*XUnit,
    // 默认值=60)

#ifdef USE_OLDDLL
    typedef int32_t (*SetMiscellaneou_)(int32_t ch, DWORD wParam, DWORD lParam);
#else
#if defined(_WIN64) || defined(__LP64__) || defined(__x86_64__)
    typedef int32_t (*SetMiscellaneou_)(int32_t ch, uint64_t wParam, uint64_t lParam);
#else
    typedef int32_t (*SetMiscellaneou_)(int32_t ch, DWORD wParam, DWORD lParam);
#endif
#endif
    //	功能：设置所有的杂项参数 (ch=-1转义为设定应用程序接口设置, lParam为接口设置指针)	//2014-08-12: &&&&&&

    typedef int32_t (*EvalResul_)(TDLLRESINF *resInf, TDLLEPINF *epInf, TDLLIDTINF *idtInf, TDLLMETRIC *metric);
    //	功能：因改变计算方法或组分表，对已完成的积分结果进行重算，刷新结果表
    //	参数：
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*EvalColumnPer_)(TDLLResultListItem *pHead, int32_t pCount, int32_t *smpHead, float freq);
    //	功能：计算柱系统评价指标(W50、5σ、Plates、Resolution、Symmetry、M1、M2)
    //	参数：

    typedef double (*EvalKHeight_)(TDLLResultListItem *pHead, int32_t *smpHead, double k, float freq, double *lpWL,
                                   double *lpWR);
    //	功能：计算谱峰任意比例峰高出的左、右宽度
    //	参数：
    //		double k: 峰高比例系数(半高峰宽k=0.5, 1/4高峰宽k=0.25, 拖尾因子k=0.05)  //2011-03-09: &&&&&&
    //		double *lpWL: 左宽[min]指针
    //		double *lpWR: 右宽[min]指针
    //	返回值：宽度[min] (左宽+右宽)

    typedef int32_t (*EvalColumnPerfE_)(TDLLResultListItem *pHead, int32_t pCount, int32_t *smpHead, float freq,
                                        double xMinUnitK);
    //	功能：计算柱系统评价指标(W50、5σ、Plates、Resolution、Symmetry、M1、M2)
    //	参数：
    //		double xMinUnitK: X轴标注单位(默认min)到最小标注单位(算面积用,默认sec)的换算系数(XMinUnit=XMinUnitK*XUnit,
    // 默认=60)	//2013-01-06: ++++++

    typedef double (*EvalKHeightWE_)(TDLLResultListItem *pHead, int32_t *smpHead, double k, float freq, double xMinUnitK,
                                     double *lpWL, double *lpWR);
    //	功能：计算谱峰任意比例峰高出的左、右宽度
    //	参数：
    //		double k: 峰高比例系数(半高峰宽k=0.5, 1/4高峰宽k=0.25, 拖尾因子k=0.05)  //2011-03-09: &&&&&&
    //		double xMinUnitK: X轴标注单位(默认min)到最小标注单位(算面积用,默认sec)的换算系数(XMinUnit=XMinUnitK*XUnit,
    // 默认=60)	//2013-01-06: ++++++ 		double *lpWL: 左宽[min]指针 		double *lpWR: 右宽[min]指针
    // 返回值：宽度[min] (左宽+右宽)

    typedef int32_t (*EvalGrou_)(TDLLGRPINF *grpInf, TDLLRESINF *resInf);
    //	功能：对结果表进行分组计算
    //	参数：
    //		GRPINF *grpInf: 指定的分组表描述指针 (read only)
    //		RESINF *resInf: 指定的结果表描述指针 (modified)
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    typedef int32_t (*EvalCalibFac_)(TDLLSTDINF *stdInf, TEPara *epara, TDLLIDTINF *idtInf);
    //	功能：对指定的标样表完成校正因子计算
    //	参数：
    //		STDINF *stdInf: 指定的标样表描述指针 (read only)
    //		EPARA *epara: 指定的峰处理参数表指针 (read only)
    //		IDTINF *idtInf: 指定的组份表描述指针 (modified)
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    // ****** 手动积分支持函数: ***************************

    /////////// 调整峰事件 ////////////////

    typedef int32_t (*ManualPeakStar_)(int32_t ch, float startTime);
    //	功能：调整峰组起始点时间
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float startTime: 拟定的峰组起始时间(min.)
    //	返回值:
    //		TRUE：表示已修正了峰组起始点时间, 并重算结果表
    //		FALSE: 表示拟定的峰组起始点不合理

    typedef int32_t (*ManualPeakEn_)(int32_t ch, float endTime);
    //	功能：调整峰组结束点时间
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float endTime: 拟定的峰组结束时间(min.)
    //	返回值:
    //		TRUE：表示已修正了峰组结束点时间, 并重算结果表
    //		FALSE: 表示拟定的峰组结束点不合理

    typedef int32_t (*ManualPeakMoveSpli_)(int32_t ch, float valleyTime);
    //	功能：移动分割线(调整峰谷点)
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float valleyTime: 拟定的峰谷点(min.)
    //	返回值:
    //		TRUE：表示已修正了峰谷点时间, 并重算结果表
    //		FALSE: 表示拟定的峰谷点不合理

    typedef int32_t (*ManualPeakAddSpli_)(int32_t ch, float splitTime);
    //	功能：增加分割线
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float splitTime: 欲增加的分割线位置(min., 近似值)
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    typedef int32_t (*ManualPeakDelSpli_)(int32_t ch, float splitTime);
    //	功能：删除分割线
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float splitTime: 欲删除的分割线位置(min., 近似值)
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    typedef int32_t (*ManualPeakAddOnlyOn_)(int32_t ch, float beginTime, float endTime);
    //	功能：增加单一峰
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 拟定的峰起点(min.)
    //		float stopTime: 拟定的峰落点(min.)
    //	返回值:
    //		TRUE：成功, 并重算结果表(可能会重新调整起点及落点)
    //		FALSE: 失败, 表示拟定的起点或落点不合理,或顶点找不到

    typedef int32_t (*ManualPeakDelet_)(int32_t ch, float beginTime, float endTime);
    //	功能：删除峰
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    ////////// 调整基线事件 ///////////////////
    typedef int32_t (*ManualBaseValle_)(int32_t ch, float beginTime, float endTime);
    //	功能：谷谷基线
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE: 成功; 设置峰位及峰标志, 并重算结果表
    //		FALSE: 失败

    typedef int32_t (*ManualBaseTogethe_)(int32_t ch, float beginTime, float endTime);
    //	功能：强制垂切(峰合并)
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float endTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE: 成功; 设置相应的谷峰峰位及峰标志, 并重算结果表
    //		FALSE: 失败

    typedef int32_t (*ManualBaseTailTangen_)(int32_t ch, float beginTime, float endTime);
    //	功能：强制拖尾(后切线切割)
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float endTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE: 成功; 设置相应的拖尾峰位及峰标志, 并重算结果表
    //		FALSE: 失败

    typedef int32_t (*ManualBaseFrontTangen_)(int32_t ch, float beginTime, float endTime);
    //	功能：前切线切割
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float endTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE: 成功; 设置相应的拖尾峰位及峰标志, 并重算结果表
    //		FALSE: 失败

    // 以下事件函数暂定为空：

    typedef int32_t (*ManualBaseForwHor_)(int32_t ch, float beginTime, float endTime);
    //	功能：向前水平基线
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    typedef int32_t (*ManualBaseBackHor_)(int32_t ch, float beginTime, float endTime);
    //	功能：向后水平基线
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    ////////// 调整峰辨识参数事件 ///////////

    typedef int32_t (*ManualParaWidt_)(int32_t ch, float beginTime, float endTime, float pkWidth);
    //	功能：调整峰宽参数
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //		float pkWidth: 拟定的峰宽参数值
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    typedef int32_t (*ManualParaNois_)(int32_t ch, float beginTime, float endTime, float pkNoise);
    //	功能：调整噪声参数
    //	参数：
    //		int32_t ch: 指定的通道号
    //		float beginTime: 事件的开始时间(min.)
    //		float stopTime: 事件的结束时间(min.)
    //		float pkNoise: 拟定的峰宽参数值
    //	返回值:
    //		TRUE：成功, 并重算结果表
    //		FALSE: 失败.

    ////////// 其他: //////////////////////
    typedef int32_t (*UpdateResul_)(int32_t ch, int32_t pStart, int32_t pEnd);
    //	功能：基于手动积分事件更新指定通道的结果表(及分组表)
    //	参数：
    //		int32_t ch: 指定的通道号
    //		int32_t pStart: 事件作用于结果表的起始峰号(从0号开始)
    //		int32_t pEnd: 事件作用于结果表的结束峰号(从0号开始)
    //	返回值:
    //		TRUE: 成功
    //		FALSE: 失败

    // double CvtConcToAmt(double conc, TDLLMETRIC *metric, METHOD method);
    typedef double (*CvtConcToAm_)(double conc, TDLLMETRIC *metric, int32_t method);
    //	功能：将标样浓度表(StdCpt)中的组份浓度转换为组份用量
    //	参数：
    //		double conc: 组份浓度
    //		METRIC *metric: 标样计量信息结构指针
    //		METHOD method: 定量方法
    //	返回值：组份用量(绝对值)

    typedef double (*CvtConcToAmtByIst_)(double conc, TDLLMETRIC *metric);
    //	功能：将标样浓度表(StdCpt)中的组份浓度转换为组份用量
    //	参数：
    //		double conc: 组份浓度
    //		METRIC *metric: 标样计量信息结构指针
    //		METHOD method: 定量方法
    //	返回值：组份用量(绝对值)

    //********** 自动峰参数学习函数 ********************
    typedef int32_t (*LearnAutoPar_)(AUTOPOOL *autoPool, float freq, AUTOPARA *autoPara);
    //	功能: 自动峰参数学习
    //	参量:
    //		AUTOPOOL *autoPool: 学习池结构指针
    //		float freq: 采样频率
    //		AUTOPARA *autoPara: 自动峰参数结构指针
    //	返回值: TRUE

    typedef int32_t (*MakeAutoPar_)(int32_t *buf, int32_t len, float freq, AUTOPARA *autoPara);
    //	功能: 自动峰参数学习
    //	参量:
    //		int32_t *buf: 学习样本数据缓冲区
    //		float freq: 采样频率
    //		AUTOPARA *autoPara: 自动峰参数结构指针
    //	返回值: TRUE

    typedef int32_t (*LearnAutoIPar_)(AUTOPOOL *autoPool, float freq, AUTOIPARA *autoIPara);
    //	功能: 自动峰参数学习
    //	参量:
    //		AUTOPOOL *autoPool: 学习池结构指针
    //		float freq: 采样频率
    //		AUTOIPARA *autoIPara: 自动峰参数结构指针
    //	返回值: TRUE

    typedef int32_t (*MakeAutoIPar_)(int32_t *buf, int32_t len, float freq, AUTOIPARA *autoIPara);
    //	功能: 自动峰参数学习
    //	参量:
    //		int32_t *buf: 学习样本数据缓冲区
    //		float freq: 采样频率
    //		AUTOIPARA *autoIPara: 自动峰参数结构指针
    //	返回值: TRUE

    typedef int32_t (*MdyAnalStopTim_)(int32_t ch, float fMinutes);
    //	功能: 修改指定通道的分析停止时间
    //	参数:
    //		int32_t ch: 指定的通道号
    //		float fMinutes: 新的分析停止时间
    //	注意: 当在实时采样的过程中加大了分析时长时,务必调用该函数 ////////

    typedef int32_t (*MdyPeakSmpHea_)(int32_t ch, int32_t *pSmpHead);
    //	功能: 修改指定通道的谱图数据缓区头  //// (应与MdyAnalStopTime配套使用)
    //	参数:
    //		int32_t ch: 指定的通道号
    //		int32_t* pSmpHead: 新的谱图数据缓区头
}
